package com.qkjia.java8;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestSimpleDateFormat {
	
	public static void main(String[] args) throws Exception {

	/*
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

		// 返回结果并可能引发异常的任务。 实现者定义了一个没有参数的单一方法，称为call
		Callable<Date> task = new Callable<Date>() {

			@Override
			public Date call() throws Exception {
				// 从给定字符串的开头解析文本以生成日期
				return sdf.parse("20161121");
			}
			
		};

		// 一个Executor提供管理终止的方法和可以生成Future以跟踪一个或多个异步任务的进度的方法。
		ExecutorService pool = Executors.newFixedThreadPool(10);

		// Future表示异步计算的结果
		List<Future<Date>> results = new ArrayList<>();
		
		for (int i = 0; i < 10; i++) {
			// 提交一个返回值的任务以供执行，并返回一个表示任务未决结果的 Future。
			results.add(pool.submit(task));
		}
		
		for (Future<Date> future : results) {
			System.out.println(future.get());
		}
		
		pool.shutdown();*/

	/*
		//解决多线程安全问题
		Callable<Date> task = new Callable<Date>() {

			@Override
			public Date call() throws Exception {
				return DateFormatThreadLocal.convert("20161121");
			}
			
		};

		// 创建固定数量线程的线程池 去银行柜台办理业务 适用于长期任务 性能更好
		ExecutorService pool = Executors.newFixedThreadPool(10);
		
		List<Future<Date>> results = new ArrayList<>();
		
		for (int i = 0; i < 10; i++) {
			results.add(pool.submit(task));
		}
		
		for (Future<Date> future : results) {
			System.out.println(future.get());
		}
		
		pool.shutdown();
		*/


		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");

		// Callable 返回结果并可能引发异常的任务。 实现者定义了一个没有参数的单一方法，称为call
		Callable<LocalDate> task = new Callable<LocalDate>() {

			@Override
			public LocalDate call() throws Exception {
				LocalDate ld = LocalDate.parse("20161121", dtf);
				return ld;
			}
			
		};

		ExecutorService pool = Executors.newFixedThreadPool(10);
		
		List<Future<LocalDate>> results = new ArrayList<>();
		
		for (int i = 0; i < 10; i++) {
			results.add(pool.submit(task));
		}
		
		for (Future<LocalDate> future : results) {
			System.out.println(future.get());
		}
		
		pool.shutdown();
	}

}
